#include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

struct GeoTimeData
{
    float latitude;   // 纬度
    float longitude;  // 经度
    float altitude;   // 海拔高度
    time_t timestamp; // 时间戳（UNIX时间）
};

// 返回固定的GPS信息（例如：36.12, 118.92, 海拔987米，固定时间戳）
GeoTimeData generateGeoTimeData()
{
    GeoTimeData data;

    // 设置固定的经纬度和海拔信息
    data.latitude = 36.12f;   // 纬度
    data.longitude = 118.92f; // 经度
    data.altitude = 987.0f;   // 海拔高度，987米

    // 设置固定的时间戳（例如：Thu Nov 7 14:15:56 2024）
    // 对应的UNIX时间戳为：1667834156
    data.timestamp = 1667834156;
    return data;
}

int main()
{
    int server_sockfd, client_sockfd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_len = sizeof(client_addr);
    char buffer[1024];

    // 创建TCP套接字
    if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("Socket creation failed");
        exit(1);
    }

    // 设置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080); // 监听8080端口
    server_addr.sin_addr.s_addr = INADDR_ANY;

    // 绑定套接字
    if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        perror("Bind failed");
        exit(1);
    }

    // 开始监听
    if (listen(server_sockfd, 5) < 0)
    {
        perror("Listen failed");
        exit(1);
    }

    std::cout << "Server is waiting for connections on port 8080..." << std::endl;
    while (1)
    {
        // 接受客户端连接
        if ((client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_len)) < 0)
        {
            perror("Accept failed");
            exit(1);
        }

        std::cout << "Client connected!" << std::endl;

        // while (1)
        // {
        // 接收客户端请求
        int n = recv(client_sockfd, buffer, sizeof(buffer), 0);
        if (n < 0)
        {
            perror("Receive failed");
            continue;
        }

        if (n > 0)
        {
            char ip_buf[32];
            std::string ip = ::inet_ntop(AF_INET, &client_addr.sin_addr, ip_buf, sizeof(ip_buf));
            int port = client_addr.sin_port;
            std::cout << "Client[" << ip << "][" << port << "] request:" << buffer << std::endl;
            GeoTimeData data = generateGeoTimeData();

            // 在服务器端显示生成的GPS信息
            std::cout << "\nSending response with GPS data:" << std::endl;
            std::cout << "纬度: " << data.latitude << std::endl;
            std::cout << "经度: " << data.longitude << std::endl;
            std::cout << "海拔: " << data.altitude << " 米" << std::endl;
            std::cout << "时间戳: " << ctime(&(data.timestamp)) << std::endl; // 打印时间

            // 发送固定的GPS信息
            send(client_sockfd, &data, sizeof(GeoTimeData), 0);

            // 每次响应完请求后暂停1秒
            sleep(1); // 延时1秒，可以根据需要调整这个值
        }
    }

    close(client_sockfd);
    close(server_sockfd);
    return 0;
}